커스텀 예외 설계

커스텀 예외 설계

요구사항(IllegalArgumentException)을 만족하면서 명시적인 커스텀 예외를 사용하는 전략

핵심 전략 — 상속으로 요구사항과 명시성 동시 만족

// 커스텀 예외가 IllegalArgumentException을 상속
public class CarRacingException extends IllegalArgumentException {
    private final ErrorCode errorCode;

    public CarRacingException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }
}

CarRacingExceptionIllegalArgumentException의 하위 타입(IS-A 관계)이므로,
IllegalArgumentException을 요구하는 catch문이나 테스트에서 그대로 동작.


ErrorCode Enum 패턴

public enum ErrorCode {
    EMPTY_CARS("[ERROR] 자동차 이름이 비어 있습니다."),
    INVALID_CAR_NAME("[ERROR] 자동차 이름은 5자 이하여야 합니다."),
    INVALID_ROUND("[ERROR] 시도 횟수는 1 이상의 정수여야 합니다.");

    private final String message;

    ErrorCode(String message) { this.message = message; }
    public String getMessage() { return message; }
}

이점

방식 단점
throw new IllegalArgumentException("메시지") 에러 종류 파악 어려움, 재사용 불가
throw new CarRacingException(ErrorCode.INVALID_CAR_NAME) 에러 종류 명확, 한 곳에서 관리, 재사용 가능

관련 개념